/**
 * @file SystemeDeVersionnageTest.h
 * @author Pierre Le Bodic
 * @date Dimanche 1 janvier 2012
 */

#ifndef _SYSTEME_DE_VERSIONNAGE_TEST_
#define _SYSTEME_DE_VERSIONNAGE_TEST_

#include "gtest.h"
#include <vector>
#include "SystemeDeVersionnage.h"

namespace gestionnaireDeVersions {
   using std::vector;
/**
 * Cette classe permet de paramétrer SystemeDeVersionnageTest afin de pouvoir
 * tester la classe SystemeDeVersionnage quelque soit l'implémentation
 * qui en est faite (ex: VersionnageALaGNU).
 * http://code.google.com/p/googletest/wiki/AdvancedGuide#Value_Parameterized_Tests
 */
class InstanceDeTestDUnSystemeDeVersionnage {
   private:
   SystemeDeVersionnage *systeme;
   
   //des exemples de chaînes non valides
   vector<string> chainesNonValides;
   //des exemples de chaînes valides
   vector<string> chainesValides;
   
   //Un vecteur de chaînes de caractères représentant des versions
   //telles que pour une chaîne donnée dans le vecteur, toutes les chaînes
   //avant elle correspondent à des versions plus anciennes, et toutes
   //les chaînes après à des versions plus récentes.
   vector<string> chainesCroissantes;
   
   public:
   
   InstanceDeTestDUnSystemeDeVersionnage(SystemeDeVersionnage * systeme) : systeme(systeme), chainesNonValides(), chainesValides(), chainesCroissantes(){}
   
   ~InstanceDeTestDUnSystemeDeVersionnage(){delete systeme;}
   
   
   InstanceDeTestDUnSystemeDeVersionnage* ajouteChaineValide(string chaineValide) {
      chainesValides.push_back(chaineValide); 
      return this;
   }
   
   InstanceDeTestDUnSystemeDeVersionnage* ajouteChaineNonValide(string chaineNonValide) {
      chainesNonValides.push_back(chaineNonValide);
      return this;
   }
   
   InstanceDeTestDUnSystemeDeVersionnage* ajouteChaineCroissante(string chaineCroissante) {
      chainesCroissantes.push_back(chaineCroissante);
       return this;
   }
   
   const SystemeDeVersionnage * getSystemeDeVersionnage() const {
      return systeme;
   }
   
   const unsigned int nbChainesNonValides() const{
      return chainesNonValides.size();
   }
   
   const string getChaineNonValide(int indice) const {
      return chainesNonValides.at(indice);
   } 
   
   

   const unsigned int nbChainesValides() const{
      return chainesValides.size();
   }
   
   const string getChaineValide(int indice) const {
      return chainesValides.at(indice);
   } 
   
   
   
   const unsigned int nbChainesCroissantes() const{
      return chainesCroissantes.size();
   }
   
   const string getChaineCroissante(int indice) const {
      return chainesCroissantes.at(indice);
   } 
   
};
   
/**
 * Cette classe teste une classe abstraite, 
 * mais pour réaliser les tests il faut manipuler des instances.
 * Cette classe est donc paramétrée par InstanceDeTestDUnSystemeDeVersionnage
 * de manière à pouvoir tester l'implémentation de SystemeDeVersionnage
 * dans chacune de ses classes filles en utilisant les tests écrits pour 
 * SystemeDeVersionnage.
 * http://code.google.com/p/googletest/wiki/AdvancedGuide#Value_Parameterized_Tests
 */
class SystemeDeVersionnageTest : public ::testing::TestWithParam<const InstanceDeTestDUnSystemeDeVersionnage*> {

};
}//namespace
#endif //_SYSTEME_DE_VERSIONNAGE_TEST_
